#include "IMUserManager.h"
#include "IMUser.h"
IMUserManager *IMUserManager::instance_ = nullptr;
void IMUserManager::addUser(const IMUserPtr user)
{
    users_id_[user->getUid()] = user;
    auto con = user->getSession();
    if (con != nullptr)
    {
        users_hash_[con->getToken()] = user;
    }
}

void IMUserManager::removeUser(const IMUserPtr user)
{
    users_id_.erase(user->getUid());
    auto con = user->getSession();
    if (con != nullptr)
    {
        users_hash_.erase(con->getToken());
    }
}

void IMUserManager::removeUser(const userid_t &uid)
{
    auto it = users_id_.find(uid);
    if (it != users_id_.end())
    {
        auto con = it->second->getSession();
        if (con != nullptr)
        {
            users_hash_.erase(con->getToken());
        }
        users_id_.erase(it);
    }
}

void IMUserManager::removeUser(const std::string &token)
{
    auto it = users_hash_.find(token);
    if (it != users_hash_.end())
    {
        auto con = it->second->getSession();
        if (con != nullptr)
        {
            users_id_.erase(it->second->getUid());
        }
        users_hash_.erase(it);
    }
}

IMUserPtr IMUserManager::FindUser(const userid_t &uid) const
{
    auto it = users_id_.find(uid);
    if (it != users_id_.end())
    {
        return it->second;
    }
    return nullptr;
}

IMUserPtr IMUserManager::FindUser(const std::string &token)
{
    auto it = users_hash_.find(token);
    if (it != users_hash_.end())
    {
        return it->second;
    }
    return nullptr;
}
